1 Domain problem formulation

What is the real-world question? This could be hypothesis-driven or discovery-based.

Some advice


Why is this question interesting and important? What are the implications of better understanding this data?


Briefly describe any background information necessary to understand this problem.

Some advice


Briefly describe how this question can be answered in the context of a model or analysis.


Outline the rest of the report/analysis.


2 Data

What is the data under investigation? Provide a brief overview/description of the data.


Describe how your data connects to the domain problem.


2.1 Data Collection

How was the data collected or generated (including details on the experimental design)? Be as transparent as possible so that conclusions made from this data are not misinterpreted down the road.


Describe any limitations when using the data to answer the domain problem of interest.


Where is the data stored, and how can it be accessed by others (if applicable)?


2.2 Data Splitting

TODO: add advice for possible data splits, AK getting nice figure together

Decide on the proportion of data in each split.

Decide on the “how” to split the data (e.g., random sampling, stratified sampling, etc.), and explain why this is a reasonable way to split the data.


Split the data into a training, validation, and test set.

data_split <- dataSplit(X = X, y = y, stratified_by = y,
                        train_prop = params$train_prop, 
                        valid_prop = params$valid_prop, 
                        test_prop = params$test_prop)
Xtrain <- data_split$X$train
Xvalid <- data_split$X$validate
Xtest <- data_split$X$test
ytrain <- data_split$y$train
yvalid <- data_split$y$validate
ytest <- data_split$y$test

Provide summary statistics and/or figures of the three data sets to illustrate how similar (or different) they are.


2.2.1 Data Splitting Overview

X Data Split

plotDataSplit(Xtrain, Xvalid, Xtest, 
              xlab = "X", title = "Overall X Distribution")

Y Data Split

plotDataSplit(ytrain, yvalid, ytest, 
              xlab = "y", title = "Overall y Distribution")

2.3 Data Cleaning and Preprocessing

What steps were taken to clean the data? More importantly, why was the data cleaned in this way?

Discuss all inconsistencies, problems, oddities in the data (e.g., missing data, errors in data, outliers, etc.).

Record your preprocessing steps in a way such that if someone else were to reproduce your analysis, they could easily replicate and understand your steps.

It can be helpful to include relevant plots that explain/justify the choices that were made when cleaning the data.

If more than one preprocessing pipeline is reasonable, examine the impacts of these alternative preprocessing pipelines on the final data results.

Again, be as transparent as possible. This allows others to make their own educated decisions on how best to preprocess the data.


## DO DATA CLEANING / PRE-PROCESSING HERE 
Xtrain <- log(Xtrain + 1) %>%
  removeConstantCols(verbose = 1) %>%
  removeDuplicateCols(verbose = 1) %>%
  filterColsByVar(max_p = 1000)
#> Removed 15 features with constant values
#> Removed 5 features that are duplicated
Xvalid <- log(Xvalid + 1)[, colnames(Xtrain)]
Xtest <- log(Xtest + 1)[, colnames(Xtrain)]

2.4 Data Exploration

TODO: Add drag and drop feature in shiny version for other images

The main goal of this section is to give the reader a feel for what the data “looks like” at a basic level.

Provide plots that summarize the data and perhaps even plots that convey some smaller findings which ultimately motivate the main findings.

Provide additional plots representing remaining oddities after pre-processing if applicable.

Add summary statistics in accompanying tables (or in figures) for quick comparisons.


2.4.1 Data Overview

#> Number of features: 1000
#> Number of training samples: 649
#> Number of validaiton samples: 216
#> Number of test samples: 218
# summary of types of features in (X, y) data
dataTypes(X = Xtrain, y = ytrain)

Summary Tables

# broad array of summary statistics for features in training (X, y)
tab_ls <- dataSummary(X = Xtrain, y = ytrain)
for (dtype in names(tab_ls)) {  # grouped by data type
  simChef:::subchunkify(tab_ls[[dtype]], i = chunk_idx, 
                        other_args = "results='asis'")
  chunk_idx <- chunk_idx + 1
}

X Distribution

# plot X distribution
plotDataDistribution(data = Xtrain, 
                     xlab = "X", title = "Training X Distribution")

Y Distribution

# plot y distribution
plotDataDistribution(data = ytrain, 
                     xlab = "y", title = "Training y Distribution")

Data Heatmap

# (clustered) heatmap of (X, y) data
plotDataHeatmap(X = Xtrain, y = ytrain, clust_rows = TRUE, clust_cols = TRUE,
                show_ytext = FALSE, x_text_angle = TRUE)

Feature Correlation

# (clustered) correlation heatmap
plotCorHeatmap(X = Xtrain, cor_type = "pearson", clust = TRUE,
               x_text_angle = TRUE) +
  ggplot2::labs(x = "Features", y = "Features", fill = "Cor.")

Feature Pair Plots

# feature pair plot (for a subset of features)
keep_features <- sort(
  sample(1:ncol(Xtrain), min(ncol(Xtrain), 6), replace = FALSE)
)
plotPairs(data = Xtrain, columns = keep_features, 
          color = ytrain, color_label = "y")

Marginal Associations

# marginal association plots (for a subset of features)
caret::featurePlot(x = Xtrain[, keep_features],
                   y = ytrain,
                   plot = if (is.factor(ytrain)) "box" else "scatter",
                   scales = list(x = list(relation = "free"), 
                                 y = list(relation = "free")))

PCA

# pca plot
plotPCA(X = Xtrain, npcs = 3, color = ytrain, color_label = "y",
        center = TRUE, scale = FALSE)$plot

3 Prediction Modeling

TODO: add advice on which models to select and why

Discuss the prediction methods under consideration, and explain why these methods were chosen.


Discuss the accuracy metrics under consideration, and explain why these metrics were chosen.


Note: there should be multiple methods and metrics under consideration to paint a more holistic picture of the data. At least one method should be a baseline, common approach that may not be optimal for the problem setting, but serves as a helpful comparison.

3.1 Prediction check

Carry out the prediction pipeline, outlined above.

  1. Fit prediction methods on training data.
  2. Evaluate prediction methods on validation data.
  3. Compare results, and filter out poor models.


## IF USING TIDYMODELS BACKEND, CHOOSE METHODS AND TRAINING CONTROLS HERE
cv_options <- list(nfolds = 5,
                   foldids = NULL,
                   metric = "accuracy")

model_list <- list(
  rand_forest = list(.tune_params = list(mtry = round(seq(sqrt(ncol(Xtrain)),
                                                          ncol(Xtrain) / 3,
                                                          length.out = 3))),
                     engine = list(engine = "ranger",
                                   importance = "impurity")),
  boost_tree = list(engine = "xgboost")
)
# fit/train models
fit_results <- fitModels(Xtrain = Xtrain, ytrain = ytrain,
                         model_list = model_list, cv_options = cv_options,
                         use = params$modeling_pkg)
#> [14:14:13] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on validation set
pred_results <- predictModels(fit_list = fit_results, Xtest = Xvalid)

# evaluate predictions on validation set
eval_results <- evaluateModels(pred_df = pred_results, ytest = yvalid)

# collect feature importance metrics from model fits
imp_results <- interpretModels(fit_list = fit_results)

Fit Summary

rand_forest

#> Fitting time taken: 3.21294438441594 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~182,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      649 
#> Number of independent variables:  1000 
#> Mtry:                             182 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.1809125 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [519/130]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [519/130]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [519/130]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [519/130]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [520/129]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean     SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.804 0.0293 0.785 0.8   0.838 0.769 0.829
#> 2   182 accuracy 0.809 0.0211 0.777 0.815 0.831 0.8   0.822
#> 3   333 accuracy 0.803 0.0269 0.769 0.815 0.838 0.785 0.806
#> 4    32 roc_auc  0.952 0.0123 0.944 0.960 0.961 0.962 0.935
#> 5   182 roc_auc  0.950 0.0121 0.939 0.955 0.957 0.963 0.935
#> 6   333 roc_auc  0.948 0.0151 0.939 0.954 0.957 0.964 0.926

boost_tree

#> Fitting time taken: 0.141398803393046 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 146.9 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.070381
#>        2          0.778810
#> ---                       
#>       14          0.052132
#>       15          0.044620

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 38 1 0 0 3
Her2 0 10 1 0 1
LumA 0 1 109 22 2
LumB 0 4 1 20 0
Normal 0 0 1 0 2
rand_forest Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 38 0 0 0 3
Her2 0 12 0 1 1
LumA 0 1 107 19 2
LumB 0 3 5 22 0
Normal 0 0 0 0 2

ROC Plot

PR Plot

3.2 Stability check

Taking the prediction methods that pass the prediction check, perform stability analysis.

  1. Specify and justify the appropriate data perturbation(s).
  2. Re-fit the prediction methods on these perturbed data sets.
  3. Evaluate prediction methods on validation data.
  4. Assess stability across the data perturbations as well as across the various methods.
  5. Filter out poor models where necessary and interpret stability results.


n_reps <- 2 # increase for better stability measures when not testing code

# p <- progressr::progressor(steps = n_reps)
# future::plan(multisession, workers = min(n_reps, parallel::detectCores() - 1))
bootstrap_model_results <- future.apply::future_replicate(
  n = n_reps,
  expr = {
    bootstrap <- sample(1:nrow(Xtrain), nrow(Xtrain), replace = TRUE)
    Xtrain_b <- Xtrain[bootstrap, ]
    ytrain_b <- ytrain[bootstrap]
    
    # fit/train models on bootstrap data
    fit_results_b <- fitModels(Xtrain = Xtrain_b, ytrain = ytrain_b,
                               model_list = model_list, cv_options = cv_options,
                               use = params$modeling_pkg)

    # make prediction on validation set
    pred_results_b <- predictModels(fit_list = fit_results_b, Xtest = Xvalid)

    # evaluate predictions on validation set
    eval_results_b <- evaluateModels(pred_df = pred_results_b, ytest = yvalid)
    
    # collect feature importance metrics from model fits
    imp_results_b <- interpretModels(fit_list = fit_results_b)
    
    return(list(# fit = fit_results_b,  # uncomment if need bootstrap fits; can be memory intensive
                predictions = pred_results_b,
                eval_metrics = eval_results_b,
                importances = imp_results_b))
  },
  simplify = FALSE
)
#> [14:16:36] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.
#> [14:19:14] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

bootstrap_model_errs <- purrr::map_dfr(bootstrap_model_results,
                                       ~.x$eval_metrics$metrics,
                                       .id = "bootstrap_id")
bootstrap_model_preds <- purrr::map(bootstrap_model_results, "predictions")
bootstrap_model_imps <- purrr::map_dfr(bootstrap_model_results, "importances",
                                       .id = "bootstrap_id")

# summarize bootstrap model error metrics
bootstrap_model_errs_summary <- bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -Metric), 
                      names_to = "Method", values_to = "Value") %>%
  dplyr::group_by(Method, Metric) %>%
  dplyr::summarise(Mean = mean(Value), SD = sd(Value), .groups = "drop") %>%
  tidyr::pivot_longer(cols = c(Mean, SD), 
                      values_to = "Value", names_to = "Statistic") %>%
  tidyr::pivot_wider(names_from = "Method", values_from = "Value") %>%
  dplyr::arrange(Metric, Statistic)

Table

# table of accuracy metrics
prettyTable(
  bootstrap_model_errs_summary, 
  digits = 2, sigfig = FALSE, rownames = FALSE,
  html = TRUE,
  caption = "Validation Prediction Accuracies Over Bootstrapped Training Fits", 
  html_options = list(
    extensions = "RowGroup",
    options = list(dom = "t",
                   rowGroup = list(dataSrc = 0),
                   columnDefs = list(list(className = "dt-center", 
                                          targets = "_all"),
                                     list(visible = FALSE,
                                          targets = 0)))
  )
)
# simChef::pretty_kable( # bootstrap_model_errs_summary %>% # dplyr::select(-Metric) %>% # dplyr::rename(Metric = Statistic), # digits = 2, sigfig = FALSE, full_width = FALSE, # format = ifelse(knitr::is_html_output(), "html", "latex"), # caption = "Validation Prediction Accuracies Over Bootstrapped Training Fits" # ) %>% # kableExtra::group_rows( # index = rep(2, length(unique(bootstrap_model_errs_summary$Metric))) %>% # setNames(unique(bootstrap_model_errs_summary$Metric)), # label_row_css = "background: #DDDDDD", # ) %>% # kableExtra::scroll_box(height = "500px")

Plot

# boxplots
bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -Metric), 
                      names_to = "Method", values_to = "Value") %>%
  plotBoxplot(x_str = "Method", y_str = "Value") +
  ggplot2::facet_wrap(~ Metric) +
  ggplot2::labs(title = "Validation Prediction Accuracies Over Bootstrapped Training Fits")

3.3 Interpretability

For the models that pass the prediction and stability checks, extract the important features in the predictive models that are stable across both data and model perturbations. Determining the importance of a feature can be method dependent.


Full Model (without stability)

Table

prettyTable(imp_results, digits = 2, sigfig = FALSE,
            caption = "Variable Importances")

Plots

plotFeatureImportance(imp_results,
                      use_rankings = FALSE,
                      use_facets = TRUE,
                      interactive = FALSE)

plotFeatureImportancePair(imp_results,
                          use_rankings = TRUE,
                          interactive = FALSE)

Bootstrapped Model (with stability)

Table

bootstrap_model_imps_summary <- bootstrap_model_imps %>%
  dplyr::group_by(Method, Variable) %>%
  dplyr::summarise(`Mean Importance` = mean(Importance),
                   `Median Importance` = median(Importance),
                   `SD Importance` = sd(Importance),
                   `Min Importance` = min(Importance),
                   `Max Importance` = max(Importance), 
                   .groups = "keep")
prettyTable(
  bootstrap_model_imps_summary, 
  digits = 2, sigfig = F, 
  caption = "Summary of variable importances across bootstrapped models"
)

Plots

plotFeatureImportanceStability(bootstrap_model_imps,
                               use_rankings = FALSE,
                               use_facets = TRUE,
                               interactive = FALSE)

4 Main Results

Interpret and summarize the prediction and stability results.


Evaluate pipeline on test data.

Xtrain_final <- dplyr::bind_rows(Xtrain, Xvalid)
ytrain_final <- c(ytrain, yvalid)

# fit/train models
fit_results_final <- fitModels(Xtrain = Xtrain_final, ytrain = ytrain_final,
                               model_list = model_list, cv_options = cv_options,
                               use = params$modeling_pkg)
#> [14:24:07] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on test set
pred_results_final <- predictModels(fit_list = fit_results_final, Xtest = Xtest)

# evaluate predictions on test set
eval_results_final <- evaluateModels(pred_df = pred_results_final, ytest = ytest)

# collect feature importance metrics from model fits
imp_results_final <- interpretModels(fit_list = fit_results_final)

Summarize test set prediction and/or interpretability results.


Fit Summary

rand_forest

#> Fitting time taken: 4.54606004953384 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~182,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      865 
#> Number of independent variables:  1000 
#> Mtry:                             182 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.165222 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [692/173]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [692/173]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [692/173]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [692/173]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [692/173]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean     SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.818 0.0120 0.809 0.815 0.809 0.838 0.821
#> 2   182 accuracy 0.823 0.0133 0.821 0.809 0.844 0.827 0.815
#> 3   333 accuracy 0.817 0.0226 0.827 0.786 0.844 0.827 0.803
#> 4    32 roc_auc  0.961 0.0153 0.967 0.973 0.973 0.937 0.954
#> 5   182 roc_auc  0.961 0.0151 0.967 0.973 0.974 0.939 0.951
#> 6   333 roc_auc  0.959 0.0160 0.966 0.972 0.973 0.938 0.946

boost_tree

#> Fitting time taken: 0.186192584037781 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 166.7 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.065040
#>        2          0.770085
#> ---                       
#>       14          0.051466
#>       15          0.043617

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 36 1 0 0 1
Her2 1 14 1 1 1
LumA 0 1 108 19 4
LumB 0 1 4 22 0
Normal 1 0 0 0 2
rand_forest Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 36 0 0 0 1
Her2 1 13 1 1 1
LumA 0 2 108 17 5
LumB 0 2 4 24 0
Normal 1 0 0 0 1

ROC Plot

PR Plot

5 Post hoc analysis

Move beyond the global prediction accuracy metrics and dive deeper into individual-level predictions for the validation and/or test set, i.e., provide a more “local” analysis.

  • Examine any points that had poor predictions.
  • Examine differences between prediction methods.


pred_results_final %>%
  dplyr::mutate(.id = rep(1:nrow(Xtest), length.out = dplyr::n())) %>%
  tidyr::pivot_wider(id_cols = .id, 
                     names_from = "Method", values_from = "predictions") %>%
  dplyr::mutate(`True Responses` = ytest) %>%
  plotPairs(columns = 2:(length(unique(pred_results_final$Method)) + 2),
            title = "Comparison of model test predictions")

6 Conclusions

Reiterate main findings, note any caveats, and clearly translate findings/analysis back to the domain problem context.


LS0tCnRpdGxlOiAiUENTIERvY3VtZW50YXRpb24iCmF1dGhvcjogIiIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpoZWFkZXItaW5jbHVkZXM6CiAgICAtIFx1c2VwYWNrYWdle2Zsb2F0fQogICAgLSBcdXNlcGFja2FnZXthbXNtYXRofQogICAgLSBcdXNlcGFja2FnZXtnZW5zeW1ifQogICAgLSBcdXNlcGFja2FnZXt0Y29sb3Jib3h9Cm91dHB1dDoKICBybWRmb3JtYXRzOjptYXRlcmlhbDoKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdXNlX2Jvb2tkb3duOiB0cnVlCiAgICBmaWdfd2lkdGg6IDEwCiAgICBmaWdfaGVpZ2h0OiA4CiAgICBsaWdodGJveDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgaW5jbHVkZXM6CiAgICAgIGJlZm9yZV9ib2R5OiBodG1sL3NldHVwLmh0bWwKICBwZGZfZG9jdW1lbnQ6CiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKcGFyYW1zOgogICMjIElOUFVUIFBBUkFNRVRFUlMgSEVSRSBPUiBVU0lORyAiS25pdCB3aXRoIFBhcmFtZXRlcnMuLi4iIElOIEFCT1ZFIEtOSVQgTUVOVQogIFhfZmlsZXBhdGg6CiAgICBsYWJlbDogIlggRGF0YSIKICAgIHZhbHVlOiBkYXRhL3RjZ2FfYnJjYV9hcnJheV9kYXRhLnJkcwogICAgaW5wdXQ6IGZpbGUgCiAgeV9maWxlcGF0aDoKICAgIGxhYmVsOiAieSBkYXRhIgogICAgdmFsdWU6IGRhdGEvdGNnYV9icmNhX3N1YnR5cGVzLnJkcwogICAgaW5wdXQ6IGZpbGUKICB0cmFpbl9wcm9wOgogICAgbGFiZWw6ICJUcmFpbmluZyBkYXRhIHByb3BvcnRpb24iCiAgICB2YWx1ZTogMC42CiAgICBpbnB1dDogbnVtZXJpYwogIHZhbGlkX3Byb3A6CiAgICBsYWJlbDogIlZhbGlkYXRpb24gZGF0YSBwcm9wb3J0aW9uIgogICAgdmFsdWU6IDAuMgogICAgaW5wdXQ6IG51bWVyaWMKICB0ZXN0X3Byb3A6CiAgICBsYWJlbDogIlRlc3QgZGF0YSBwcm9wb3J0aW9uIgogICAgdmFsdWU6IDAuMgogICAgaW5wdXQ6IG51bWVyaWMKICBtb2RlbGluZ19wa2c6CiAgICBsYWJlbDogIk1vZGVsaW5nIFBhY2thZ2UiCiAgICB2YWx1ZTogInRpZHltb2RlbHMiCiAgICBpbnB1dDogc2VsZWN0CiAgICBjaG9pY2VzOiBbImNhcmV0IiwgImgybyIsICJ0aWR5bW9kZWxzIl0KICBzZWVkOgogICAgbGFiZWw6ICJSYW5kb20gU2VlZCIKICAgIHZhbHVlOiAxMjM0NQogICAgaW5wdXQ6IG51bWVyaWMKY3NzOiBbY3NzL2N1c3RvbV9tYXRlcmlhbF9ybWRfdGhlbWUuY3NzLCBjc3MvY3VzdG9tX2NoZWNrYm94LmNzc10KIyBydW50aW1lOiBzaGlueQotLS0KCmBgYHtyIHNldHVwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNvdXJjZSgic2NyaXB0cy9ybWQtc2V0dXAuUiIsIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCkpCgojIGxvYWQgaW4gcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2tpbXIpCmxpYnJhcnkoUi51dGlscykKbGlicmFyeShkYXRhc2V0cykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHJlc2hhcGUyKQpmb3IgKGYgaW4gbGlzdC5maWxlcygiUiIsIHBhdHRlcm4gPSAiLlIiLCBmdWxsLm5hbWVzID0gVFJVRSkpIHsKICBzb3VyY2UoZiwgY2hkaXIgPSBUKQp9CgojIHNldCBzZWVkCnNldC5zZWVkKHBhcmFtcyRzZWVkKQoKIyB2YWxpZGF0ZSBpbnB1dHMKdmFsaWRhdGVEYXRhU3BsaXQocGFyYW1zJHRyYWluX3Byb3AsIHBhcmFtcyR2YWxpZF9wcm9wLCBwYXJhbXMkdGVzdF9wcm9wKQoKIyBsb2FkIGRhdGEgaW4KWCA8LSBsb2FkRmlsZShwYXJhbXMkWF9maWxlcGF0aCkKeSA8LSBsb2FkRmlsZShwYXJhbXMkeV9maWxlcGF0aCkKdmFsaWRhdGVEYXRhKFgsIHkpCgojIGluaXRpYWxpemUgY291bnRlciBmb3Igc3ViY2h1bmtpZnkKY2h1bmtfaWR4IDwtIDEKYGBgCgojIERvbWFpbiBwcm9ibGVtIGZvcm11bGF0aW9uCgpXaGF0IGlzIHRoZSByZWFsLXdvcmxkIHF1ZXN0aW9uPyBUaGlzIGNvdWxkIGJlIGh5cG90aGVzaXMtZHJpdmVuIG9yIGRpc2NvdmVyeS1iYXNlZC4KCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KU29tZSBhZHZpY2UKYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCldoeSBpcyB0aGlzIHF1ZXN0aW9uIGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQ/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgYmV0dGVyIHVuZGVyc3RhbmRpbmcgdGhpcyBkYXRhPwoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpCcmllZmx5IGRlc2NyaWJlIGFueSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byB1bmRlcnN0YW5kIHRoaXMgcHJvYmxlbS4KCmBgYHthc2lzLCBoZWxwID0gVFJVRX0KU29tZSBhZHZpY2UKYGBgCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCkJyaWVmbHkgZGVzY3JpYmUgaG93IHRoaXMgcXVlc3Rpb24gY2FuIGJlIGFuc3dlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgbW9kZWwgb3IgYW5hbHlzaXMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCk91dGxpbmUgdGhlIHJlc3Qgb2YgdGhlIHJlcG9ydC9hbmFseXNpcy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyBEYXRhCgpXaGF0IGlzIHRoZSBkYXRhIHVuZGVyIGludmVzdGlnYXRpb24/IFByb3ZpZGUgYSBicmllZiBvdmVydmlldy9kZXNjcmlwdGlvbiBvZiB0aGUgZGF0YS4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKRGVzY3JpYmUgaG93IHlvdXIgZGF0YSBjb25uZWN0cyB0byB0aGUgZG9tYWluIHByb2JsZW0uCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIERhdGEgQ29sbGVjdGlvbgoKSG93IHdhcyB0aGUgZGF0YSBjb2xsZWN0ZWQgb3IgZ2VuZXJhdGVkIChpbmNsdWRpbmcgZGV0YWlscyBvbiB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbik/IEJlIGFzIHRyYW5zcGFyZW50IGFzIHBvc3NpYmxlIHNvIHRoYXQgY29uY2x1c2lvbnMgbWFkZSBmcm9tIHRoaXMgZGF0YSBhcmUgbm90IG1pc2ludGVycHJldGVkIGRvd24gdGhlIHJvYWQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCkRlc2NyaWJlIGFueSBsaW1pdGF0aW9ucyB3aGVuIHVzaW5nIHRoZSBkYXRhIHRvIGFuc3dlciB0aGUgZG9tYWluIHByb2JsZW0gb2YgaW50ZXJlc3QuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCldoZXJlIGlzIHRoZSBkYXRhIHN0b3JlZCwgYW5kIGhvdyBjYW4gaXQgYmUgYWNjZXNzZWQgYnkgb3RoZXJzIChpZiBhcHBsaWNhYmxlKT8KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyMgRGF0YSBTcGxpdHRpbmcKClRPRE86IGFkZCBhZHZpY2UgZm9yIHBvc3NpYmxlIGRhdGEgc3BsaXRzLCBBSyBnZXR0aW5nIG5pY2UgZmlndXJlIHRvZ2V0aGVyCgpEZWNpZGUgb24gdGhlIHByb3BvcnRpb24gb2YgZGF0YSBpbiBlYWNoIHNwbGl0LgoKRGVjaWRlIG9uIHRoZSAiaG93IiB0byBzcGxpdCB0aGUgZGF0YSAoZS5nLiwgcmFuZG9tIHNhbXBsaW5nLCBzdHJhdGlmaWVkIHNhbXBsaW5nLCBldGMuKSwgYW5kIGV4cGxhaW4gd2h5IHRoaXMgaXMgYSByZWFzb25hYmxlIHdheSB0byBzcGxpdCB0aGUgZGF0YS4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKU3BsaXQgdGhlIGRhdGEgaW50byBhIHRyYWluaW5nLCB2YWxpZGF0aW9uLCBhbmQgdGVzdCBzZXQuCgpgYGB7ciBzcGxpdC1kYXRhfQpkYXRhX3NwbGl0IDwtIGRhdGFTcGxpdChYID0gWCwgeSA9IHksIHN0cmF0aWZpZWRfYnkgPSB5LAogICAgICAgICAgICAgICAgICAgICAgICB0cmFpbl9wcm9wID0gcGFyYW1zJHRyYWluX3Byb3AsIAogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9wcm9wID0gcGFyYW1zJHZhbGlkX3Byb3AsIAogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3Byb3AgPSBwYXJhbXMkdGVzdF9wcm9wKQpYdHJhaW4gPC0gZGF0YV9zcGxpdCRYJHRyYWluClh2YWxpZCA8LSBkYXRhX3NwbGl0JFgkdmFsaWRhdGUKWHRlc3QgPC0gZGF0YV9zcGxpdCRYJHRlc3QKeXRyYWluIDwtIGRhdGFfc3BsaXQkeSR0cmFpbgp5dmFsaWQgPC0gZGF0YV9zcGxpdCR5JHZhbGlkYXRlCnl0ZXN0IDwtIGRhdGFfc3BsaXQkeSR0ZXN0CmBgYAoKUHJvdmlkZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kL29yIGZpZ3VyZXMgb2YgdGhlIHRocmVlIGRhdGEgc2V0cyB0byBpbGx1c3RyYXRlIGhvdyBzaW1pbGFyIChvciBkaWZmZXJlbnQpIHRoZXkgYXJlLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgojIyMgRGF0YSBTcGxpdHRpbmcgT3ZlcnZpZXcgey50YWJzZXQgLmN1c3RvbS10YWJzfQoKIyMjIyBYIERhdGEgU3BsaXQgey51bm51bWJlcmVkfQoKYGBge3IgWC1kYXRhLXNwbGl0LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90RGF0YVNwbGl0KFh0cmFpbiwgWHZhbGlkLCBYdGVzdCwgCiAgICAgICAgICAgICAgeGxhYiA9ICJYIiwgdGl0bGUgPSAiT3ZlcmFsbCBYIERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMjIyBZIERhdGEgU3BsaXQgey51bm51bWJlcmVkfQoKYGBge3IgeS1kYXRhLXNwbGl0LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90RGF0YVNwbGl0KHl0cmFpbiwgeXZhbGlkLCB5dGVzdCwgCiAgICAgICAgICAgICAgeGxhYiA9ICJ5IiwgdGl0bGUgPSAiT3ZlcmFsbCB5IERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMgRGF0YSBDbGVhbmluZyBhbmQgUHJlcHJvY2Vzc2luZwoKV2hhdCBzdGVwcyB3ZXJlIHRha2VuIHRvIGNsZWFuIHRoZSBkYXRhPyBNb3JlIGltcG9ydGFudGx5LCB3aHkgd2FzIHRoZSBkYXRhIGNsZWFuZWQgaW4gdGhpcyB3YXk/CgpEaXNjdXNzIGFsbCBpbmNvbnNpc3RlbmNpZXMsIHByb2JsZW1zLCBvZGRpdGllcyBpbiB0aGUgZGF0YSAoZS5nLiwgbWlzc2luZyBkYXRhLCBlcnJvcnMgaW4gZGF0YSwgb3V0bGllcnMsIGV0Yy4pLgoKUmVjb3JkIHlvdXIgcHJlcHJvY2Vzc2luZyBzdGVwcyBpbiBhIHdheSBzdWNoIHRoYXQgaWYgc29tZW9uZSBlbHNlIHdlcmUgdG8gcmVwcm9kdWNlIHlvdXIgYW5hbHlzaXMsIHRoZXkgY291bGQgZWFzaWx5IHJlcGxpY2F0ZSBhbmQgdW5kZXJzdGFuZCB5b3VyIHN0ZXBzLgoKSXQgY2FuIGJlIGhlbHBmdWwgdG8gaW5jbHVkZSByZWxldmFudCBwbG90cyB0aGF0IGV4cGxhaW4vanVzdGlmeSB0aGUgY2hvaWNlcyB0aGF0IHdlcmUgbWFkZSB3aGVuIGNsZWFuaW5nIHRoZSBkYXRhLgoKSWYgbW9yZSB0aGFuIG9uZSBwcmVwcm9jZXNzaW5nIHBpcGVsaW5lIGlzIHJlYXNvbmFibGUsIGV4YW1pbmUgdGhlIGltcGFjdHMgb2YgdGhlc2UgYWx0ZXJuYXRpdmUgcHJlcHJvY2Vzc2luZyBwaXBlbGluZXMgb24gdGhlIGZpbmFsIGRhdGEgcmVzdWx0cy4KCkFnYWluLCBiZSBhcyB0cmFuc3BhcmVudCBhcyBwb3NzaWJsZS4gVGhpcyBhbGxvd3Mgb3RoZXJzIHRvIG1ha2UgdGhlaXIgb3duIGVkdWNhdGVkIGRlY2lzaW9ucyBvbiBob3cgYmVzdCB0byBwcmVwcm9jZXNzIHRoZSBkYXRhLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQpHaXZlbiB0aGlzIGV4YW1wbGUgVENHQSBCUkNBIGRhdGEgc2V0LCB3ZSBmaXJzdCBwcmVwcm9jZXNzIHRoZSBkYXRhIGJ5IHJlbW92aW5nIGNvbnN0YW50IG9yIGR1cGxpY2F0ZWQgY29sdW1ucy4gVGhlbiBzaW5jZSB0aGUgYXJyYXkgZGF0YSBpcyBoaWdobHkgcmlnaHQgc2tld2VkLCB3ZSB3aWxsIGxvZy10cmFuc2Zvcm0gKGkuZS4sIGxvZyh4ICsgMSkpIHRoZSBkYXRhLiBGaW5hbGx5LCB0byBrZWVwIHRoaXMgZXhhbXBsZSB0ZW1wbGF0ZSByZWxhdGl2ZWx5IHF1aWNrIHRvIHJ1biwgd2Ugd2lsbCBvbmx5IGtlZXAgdGhlIDEwMDAgZmVhdHVyZXMgd2l0aCB0aGUgaGlnaGVzdCB2YXJpYW5jZS4KYGBgCgpgYGB7ciBwcmVwcm9jZXNzLWRhdGF9CiMjIERPIERBVEEgQ0xFQU5JTkcgLyBQUkUtUFJPQ0VTU0lORyBIRVJFIApYdHJhaW4gPC0gbG9nKFh0cmFpbiArIDEpICU+JQogIHJlbW92ZUNvbnN0YW50Q29scyh2ZXJib3NlID0gMSkgJT4lCiAgcmVtb3ZlRHVwbGljYXRlQ29scyh2ZXJib3NlID0gMSkgJT4lCiAgZmlsdGVyQ29sc0J5VmFyKG1heF9wID0gMTAwMCkKWHZhbGlkIDwtIGxvZyhYdmFsaWQgKyAxKVssIGNvbG5hbWVzKFh0cmFpbildClh0ZXN0IDwtIGxvZyhYdGVzdCArIDEpWywgY29sbmFtZXMoWHRyYWluKV0KYGBgCgoKIyMgRGF0YSBFeHBsb3JhdGlvbgoKVE9ETzogQWRkIGRyYWcgYW5kIGRyb3AgZmVhdHVyZSBpbiBzaGlueSB2ZXJzaW9uIGZvciBvdGhlciBpbWFnZXMKClRoZSBtYWluIGdvYWwgb2YgdGhpcyBzZWN0aW9uIGlzIHRvIGdpdmUgdGhlIHJlYWRlciBhIGZlZWwgZm9yIHdoYXQgdGhlIGRhdGEgImxvb2tzIGxpa2UiIGF0IGEgYmFzaWMgbGV2ZWwuCgpQcm92aWRlIHBsb3RzIHRoYXQgc3VtbWFyaXplIHRoZSBkYXRhIGFuZCBwZXJoYXBzIGV2ZW4gcGxvdHMgdGhhdCBjb252ZXkgc29tZSBzbWFsbGVyIGZpbmRpbmdzIHdoaWNoIHVsdGltYXRlbHkgbW90aXZhdGUgdGhlIG1haW4gZmluZGluZ3MuCgpQcm92aWRlIGFkZGl0aW9uYWwgcGxvdHMgcmVwcmVzZW50aW5nIHJlbWFpbmluZyBvZGRpdGllcyBhZnRlciBwcmUtcHJvY2Vzc2luZyBpZiBhcHBsaWNhYmxlLgoKQWRkIHN1bW1hcnkgc3RhdGlzdGljcyBpbiBhY2NvbXBhbnlpbmcgdGFibGVzIChvciBpbiBmaWd1cmVzKSBmb3IgcXVpY2sgY29tcGFyaXNvbnMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIyBEYXRhIE92ZXJ2aWV3IHsudGFic2V0IC5jdXN0b20tdGFic30KCmBgYHtyIGRhdGEtZGltcywgZWNobyA9IEZBTFNFfQojIHN1bW1hcnkgb2YgZGF0YSBkaW1lbnNpb25zCmRhdGFEaW1lbnNpb25zKFh0cmFpbiA9IFh0cmFpbiwgWHZhbGlkID0gWHZhbGlkLCBYdGVzdCA9IFh0ZXN0KQpgYGAKCmBgYHtyIGRhdGEtdHlwZXMsIHJlc3VsdHM9ImFzaXMiLCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIHN1bW1hcnkgb2YgdHlwZXMgb2YgZmVhdHVyZXMgaW4gKFgsIHkpIGRhdGEKZGF0YVR5cGVzKFggPSBYdHJhaW4sIHkgPSB5dHJhaW4pCmBgYAoKIyMjIyBTdW1tYXJ5IFRhYmxlcyB7LnVubnVtYmVyZWR9CgpgYGB7ciBkYXRhLXN1bW1hcnktdGFibGUsIHJlc3VsdHM9ImFzaXMiLCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIGJyb2FkIGFycmF5IG9mIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgZmVhdHVyZXMgaW4gdHJhaW5pbmcgKFgsIHkpCnRhYl9scyA8LSBkYXRhU3VtbWFyeShYID0gWHRyYWluLCB5ID0geXRyYWluKQpmb3IgKGR0eXBlIGluIG5hbWVzKHRhYl9scykpIHsgICMgZ3JvdXBlZCBieSBkYXRhIHR5cGUKICBzaW1DaGVmOjo6c3ViY2h1bmtpZnkodGFiX2xzW1tkdHlwZV1dLCBpID0gY2h1bmtfaWR4LCAKICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfYXJncyA9ICJyZXN1bHRzPSdhc2lzJyIpCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQpgYGAKCiMjIyMgWCBEaXN0cmlidXRpb24gey51bm51bWJlcmVkfQoKYGBge3IgeC1kaXN0LXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgcGxvdCBYIGRpc3RyaWJ1dGlvbgpwbG90RGF0YURpc3RyaWJ1dGlvbihkYXRhID0gWHRyYWluLCAKICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJYIiwgdGl0bGUgPSAiVHJhaW5pbmcgWCBEaXN0cmlidXRpb24iKQpgYGAKCiMjIyMgWSBEaXN0cmlidXRpb24gey51bm51bWJlcmVkfQoKYGBge3IgeS1kaXN0LXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgcGxvdCB5IGRpc3RyaWJ1dGlvbgpwbG90RGF0YURpc3RyaWJ1dGlvbihkYXRhID0geXRyYWluLCAKICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJ5IiwgdGl0bGUgPSAiVHJhaW5pbmcgeSBEaXN0cmlidXRpb24iKQpgYGAKCiMjIyMgRGF0YSBIZWF0bWFwIHsudW5udW1iZXJlZH0KCmBgYHtyIGRhdGEtaGVhdG1hcCwgYWRkX25ld19saW5lID0gVFJVRX0KIyAoY2x1c3RlcmVkKSBoZWF0bWFwIG9mIChYLCB5KSBkYXRhCnBsb3REYXRhSGVhdG1hcChYID0gWHRyYWluLCB5ID0geXRyYWluLCBjbHVzdF9yb3dzID0gVFJVRSwgY2x1c3RfY29scyA9IFRSVUUsCiAgICAgICAgICAgICAgICBzaG93X3l0ZXh0ID0gRkFMU0UsIHhfdGV4dF9hbmdsZSA9IFRSVUUpCmBgYAoKIyMjIyBGZWF0dXJlIENvcnJlbGF0aW9uIHsudW5udW1iZXJlZH0KCmBgYHtyIGZlYXR1cmUtY29yLWhlYXRtYXAsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgKGNsdXN0ZXJlZCkgY29ycmVsYXRpb24gaGVhdG1hcApwbG90Q29ySGVhdG1hcChYID0gWHRyYWluLCBjb3JfdHlwZSA9ICJwZWFyc29uIiwgY2x1c3QgPSBUUlVFLAogICAgICAgICAgICAgICB4X3RleHRfYW5nbGUgPSBUUlVFKSArCiAgZ2dwbG90Mjo6bGFicyh4ID0gIkZlYXR1cmVzIiwgeSA9ICJGZWF0dXJlcyIsIGZpbGwgPSAiQ29yLiIpCmBgYAoKIyMjIyBGZWF0dXJlIFBhaXIgUGxvdHMgey51bm51bWJlcmVkfQoKYGBge3IgZmVhdHVyZS1wYWlyLXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgZmVhdHVyZSBwYWlyIHBsb3QgKGZvciBhIHN1YnNldCBvZiBmZWF0dXJlcykKa2VlcF9mZWF0dXJlcyA8LSBzb3J0KAogIHNhbXBsZSgxOm5jb2woWHRyYWluKSwgbWluKG5jb2woWHRyYWluKSwgNiksIHJlcGxhY2UgPSBGQUxTRSkKKQpwbG90UGFpcnMoZGF0YSA9IFh0cmFpbiwgY29sdW1ucyA9IGtlZXBfZmVhdHVyZXMsIAogICAgICAgICAgY29sb3IgPSB5dHJhaW4sIGNvbG9yX2xhYmVsID0gInkiKQpgYGAKCiMjIyMgTWFyZ2luYWwgQXNzb2NpYXRpb25zIHsudW5udW1iZXJlZH0KCmBgYHtyIG1hcmdpbmFsLWFzc29jLXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgbWFyZ2luYWwgYXNzb2NpYXRpb24gcGxvdHMgKGZvciBhIHN1YnNldCBvZiBmZWF0dXJlcykKY2FyZXQ6OmZlYXR1cmVQbG90KHggPSBYdHJhaW5bLCBrZWVwX2ZlYXR1cmVzXSwKICAgICAgICAgICAgICAgICAgIHkgPSB5dHJhaW4sCiAgICAgICAgICAgICAgICAgICBwbG90ID0gaWYgKGlzLmZhY3Rvcih5dHJhaW4pKSAiYm94IiBlbHNlICJzY2F0dGVyIiwKICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IGxpc3QoeCA9IGxpc3QocmVsYXRpb24gPSAiZnJlZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxpc3QocmVsYXRpb24gPSAiZnJlZSIpKSkKYGBgCgojIyMjIFBDQSB7LnVubnVtYmVyZWR9CgpgYGB7ciBwY2EtcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBwY2EgcGxvdApwbG90UENBKFggPSBYdHJhaW4sIG5wY3MgPSAzLCBjb2xvciA9IHl0cmFpbiwgY29sb3JfbGFiZWwgPSAieSIsCiAgICAgICAgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBGQUxTRSkkcGxvdApgYGAKCiMgUHJlZGljdGlvbiBNb2RlbGluZwoKVE9ETzogYWRkIGFkdmljZSBvbiB3aGljaCBtb2RlbHMgdG8gc2VsZWN0IGFuZCB3aHkKCkRpc2N1c3MgdGhlIHByZWRpY3Rpb24gbWV0aG9kcyB1bmRlciBjb25zaWRlcmF0aW9uLCBhbmQgZXhwbGFpbiB3aHkgdGhlc2UgbWV0aG9kcyB3ZXJlIGNob3Nlbi4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKRGlzY3VzcyB0aGUgYWNjdXJhY3kgbWV0cmljcyB1bmRlciBjb25zaWRlcmF0aW9uLCBhbmQgZXhwbGFpbiB3aHkgdGhlc2UgbWV0cmljcyB3ZXJlIGNob3Nlbi4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKTm90ZTogdGhlcmUgc2hvdWxkIGJlIG11bHRpcGxlIG1ldGhvZHMgYW5kIG1ldHJpY3MgdW5kZXIgY29uc2lkZXJhdGlvbiB0byBwYWludCBhIG1vcmUgaG9saXN0aWMgcGljdHVyZSBvZiB0aGUgZGF0YS4gQXQgbGVhc3Qgb25lIG1ldGhvZCBzaG91bGQgYmUgYSBiYXNlbGluZSwgY29tbW9uIGFwcHJvYWNoIHRoYXQgbWF5IG5vdCBiZSBvcHRpbWFsIGZvciB0aGUgcHJvYmxlbSBzZXR0aW5nLCBidXQgc2VydmVzIGFzIGEgaGVscGZ1bCBjb21wYXJpc29uLgoKIyMgUHJlZGljdGlvbiBjaGVjayB7LnRhYnNldCAuY3VzdG9tLXRhYnN9CgpDYXJyeSBvdXQgdGhlIHByZWRpY3Rpb24gcGlwZWxpbmUsIG91dGxpbmVkIGFib3ZlLgoKMS4gRml0IHByZWRpY3Rpb24gbWV0aG9kcyBvbiB0cmFpbmluZyBkYXRhLgoyLiBFdmFsdWF0ZSBwcmVkaWN0aW9uIG1ldGhvZHMgb24gdmFsaWRhdGlvbiBkYXRhLgozLiBDb21wYXJlIHJlc3VsdHMsIGFuZCBmaWx0ZXIgb3V0IHBvb3IgbW9kZWxzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpgYGB7ciBjYXJldC1maXQtcGFyYW1zLCBldmFsID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAiY2FyZXQiLCBlY2hvID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAiY2FyZXQiLCBjYWNoZSA9IEZBTFNFfQojIyBJRiBVU0lORyBDQVJFVCBNT0RFTElORyBCQUNLRU5ELCBDSE9PU0UgTUVUSE9EUyBBTkQgVFJBSU5JTkcgQ09OVFJPTFMgSEVSRQpjdl9vcHRpb25zIDwtIGxpc3QobmZvbGRzID0gNSwgCiAgICAgICAgICAgICAgICAgICBmb2xkaWRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIG1ldHJpYyA9ICJBY2N1cmFjeSIpCgptb2RlbF9saXN0IDwtIGxpc3QoCiAgcmFuZ2VyID0gbGlzdCgudHVuZV9wYXJhbXMgPSBsaXN0KG10cnkgPSByb3VuZChzZXEoc3FydChuY29sKFh0cmFpbikpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sKFh0cmFpbikgLyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aC5vdXQgPSAzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0cnVsZSA9ICJnaW5pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLm5vZGUuc2l6ZSA9IDEpLAogICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9ICJpbXB1cml0eSIsCiAgICAgICAgICAgICAgICBudW0udGhyZWFkcyA9IDEpLAogIHhnYlRyZWUgPSBsaXN0KG50aHJlYWQgPSAxKQopCmBgYAoKYGBge3IgaDJvLWZpdC1wYXJhbXMsIGV2YWwgPSBwYXJhbXMkbW9kZWxpbmdfcGtnID09ICJoMm8iLCBlY2hvID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAiaDJvIiwgY2FjaGUgPSBGQUxTRX0KIyMgSUYgVVNJTkcgSDJPIE1PREVMSU5HIEJBQ0tFTkQsIENIT09TRSBNRVRIT0RTIEFORCBUUkFJTklORyBDT05UUk9MUyBIRVJFCnJlcXVpcmUoaDJvKQpjdl9vcHRpb25zIDwtIGxpc3QobmZvbGRzID0gNSwKICAgICAgICAgICAgICAgICAgIGZvbGRpZHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgbWV0cmljID0gImFjY3VyYWN5IikKCm1vZGVsX2xpc3QgPC0gbGlzdCgKICByYW5kb21Gb3Jlc3QgPSBsaXN0KC50dW5lX3BhcmFtcyA9IGxpc3QobXRyaWVzID0gcm91bmQoc2VxKHNxcnQobmNvbChYdHJhaW4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2woWHRyYWluKSAvIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMykpKSwKICAgICAgICAgICAgICAgICAgICAgIG50cmVlcyA9IDUwMCksCiAgeGdib29zdCA9IGxpc3QoKQopCgojIGluaXRpYWxpemUgaDJvIGNsdXN0ZXIKaDJvLmluaXQobnRocmVhZHMgPSAtMSkKYGBgCgpgYGB7ciB0aWR5bW9kZWxzLWZpdC1wYXJhbXMsIGV2YWwgPSBwYXJhbXMkbW9kZWxpbmdfcGtnID09ICJ0aWR5bW9kZWxzIiwgZWNobyA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gInRpZHltb2RlbHMiLCBjYWNoZSA9IEZBTFNFfQojIyBJRiBVU0lORyBUSURZTU9ERUxTIEJBQ0tFTkQsIENIT09TRSBNRVRIT0RTIEFORCBUUkFJTklORyBDT05UUk9MUyBIRVJFCmN2X29wdGlvbnMgPC0gbGlzdChuZm9sZHMgPSA1LAogICAgICAgICAgICAgICAgICAgZm9sZGlkcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICBtZXRyaWMgPSAiYWNjdXJhY3kiKQoKbW9kZWxfbGlzdCA8LSBsaXN0KAogIHJhbmRfZm9yZXN0ID0gbGlzdCgudHVuZV9wYXJhbXMgPSBsaXN0KG10cnkgPSByb3VuZChzZXEoc3FydChuY29sKFh0cmFpbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbChYdHJhaW4pIC8gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aC5vdXQgPSAzKSkpLAogICAgICAgICAgICAgICAgICAgICBlbmdpbmUgPSBsaXN0KGVuZ2luZSA9ICJyYW5nZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFuY2UgPSAiaW1wdXJpdHkiKSksCiAgYm9vc3RfdHJlZSA9IGxpc3QoZW5naW5lID0gInhnYm9vc3QiKQopCmBgYAoKYGBge3IgZml0LW1vZGVscywgY2xhc3Mub3V0cHV0PSJzY3JvbGwtMzAwIn0KIyBmaXQvdHJhaW4gbW9kZWxzCmZpdF9yZXN1bHRzIDwtIGZpdE1vZGVscyhYdHJhaW4gPSBYdHJhaW4sIHl0cmFpbiA9IHl0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2xpc3QgPSBtb2RlbF9saXN0LCBjdl9vcHRpb25zID0gY3Zfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSA9IHBhcmFtcyRtb2RlbGluZ19wa2cpCgojIG1ha2UgcHJlZGljdGlvbiBvbiB2YWxpZGF0aW9uIHNldApwcmVkX3Jlc3VsdHMgPC0gcHJlZGljdE1vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzLCBYdGVzdCA9IFh2YWxpZCkKCiMgZXZhbHVhdGUgcHJlZGljdGlvbnMgb24gdmFsaWRhdGlvbiBzZXQKZXZhbF9yZXN1bHRzIDwtIGV2YWx1YXRlTW9kZWxzKHByZWRfZGYgPSBwcmVkX3Jlc3VsdHMsIHl0ZXN0ID0geXZhbGlkKQoKIyBjb2xsZWN0IGZlYXR1cmUgaW1wb3J0YW5jZSBtZXRyaWNzIGZyb20gbW9kZWwgZml0cwppbXBfcmVzdWx0cyA8LSBpbnRlcnByZXRNb2RlbHMoZml0X2xpc3QgPSBmaXRfcmVzdWx0cykKYGBgCgoKIyMjIEZpdCBTdW1tYXJ5IHsudW5udW1iZXJlZCAudGFic2V0IC50YWJzZXQtcGlsbHN9CgpgYGB7ciBmaXQtc3VtbWFyeSwgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImFzaXMifQojIHByaW50IG91dCBmaXQgb3V0cHV0IHN1bW1hcnkKcHJpbnRGaXRSZXN1bHRzKGZpdF9yZXN1bHRzKQpgYGAKCiMjIyBQcmVkaWN0aW9uIFJlc3VsdHMgey51bm51bWJlcmVkfQoKYGBge3IgcHJlZGljdGlvbi1yZXN1bHRzLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgZGlzcGxheSBwcmVkaWN0aW9uIG1ldHJpY3MsIGNvbmZ1c2lvbiBtYXRyaWNlcywgYW5kIHJvYy9wciBwbG90cyBpZiBhcHBsaWNhYmxlCnNob3dFdmFsUmVzdWx0cyhldmFsX3Jlc3VsdHMsIGRpZ2l0cyA9IDIsIHNpZ2ZpZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgaHRtbF9vcHRpb25zID0gbGlzdChvcHRpb25zID0gbGlzdChkb20gPSAidCIpKSkKYGBgCgojIyBTdGFiaWxpdHkgY2hlY2sgey50YWJzZXQgLmN1c3RvbS10YWJzfQoKVGFraW5nIHRoZSBwcmVkaWN0aW9uIG1ldGhvZHMgdGhhdCBwYXNzIHRoZSBwcmVkaWN0aW9uIGNoZWNrLCBwZXJmb3JtIHN0YWJpbGl0eSBhbmFseXNpcy4KCjEuIFNwZWNpZnkgYW5kIGp1c3RpZnkgdGhlIGFwcHJvcHJpYXRlIGRhdGEgcGVydHVyYmF0aW9uKHMpLgoyLiBSZS1maXQgdGhlIHByZWRpY3Rpb24gbWV0aG9kcyBvbiB0aGVzZSBwZXJ0dXJiZWQgZGF0YSBzZXRzLgozLiBFdmFsdWF0ZSBwcmVkaWN0aW9uIG1ldGhvZHMgb24gdmFsaWRhdGlvbiBkYXRhLgo0LiBBc3Nlc3Mgc3RhYmlsaXR5IGFjcm9zcyB0aGUgZGF0YSBwZXJ0dXJiYXRpb25zIGFzIHdlbGwgYXMgYWNyb3NzIHRoZSB2YXJpb3VzIG1ldGhvZHMuCjUuIEZpbHRlciBvdXQgcG9vciBtb2RlbHMgd2hlcmUgbmVjZXNzYXJ5IGFuZCBpbnRlcnByZXQgc3RhYmlsaXR5IHJlc3VsdHMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCjwhLS0gVE9ETzogQW5hIC0gUHJvdmlkZSBzb21lIGV4YW1wbGUgY29kZSBoZXJlIChmb3IgYm90aCBmaXR0aW5nIGFuZCB2aXN1YWxpemluZyByZXN1bHRzKSBzbyB0aGF0IHRoZSBwcmFjdGl0aW9uZXIgY2FuIGVhc2lseSBpbnB1dCB0aGVpciBkYXRhIGFuZCBtb2RlbHMuIEFkZCBzb21ldGhpbmcgbGlrZSBKYW1lcycgc2xpZGUuIEEgZmV3IHBpY3R1cmVzIHdpdGggcG9zc2libGUgZGF0YSBwZXJ0dXJiYXRpb24gc2NoZW1lcyAoc2VwYXJhdGUgZnJvbSBwYXJhbWV0ZXIgdHVuaW5nKS4gRGF0YSBzcGxpdHRpbmcgdnMgc2FtcGxpbmcgb2Ygb2JzZXJ2YXRpb25zLiBDcm9zcy12YWxpZGF0aW9uLWlzaCBzY2hlbWUgYW5kIGZpeGVkIHRyYWluaW5nL3ZhbGlkYXRpb24gc2V0dXAgKGJvb3RzdHJhcHBpbmcsIHN1Yi1zYW1wbGluZywgc3RyYXRpZmllZC1zYW1wbGluZykuIEFkZCBwYXJhbWV0ZXIgdG8gaW5jbHVkZS9leGNsdWRlIGNlcnRhaW4gY29kZSBjaHVua3MuIC0tPgoKYGBge3Igc3RhYmlsaXR5LWNoZWNrfQpuX3JlcHMgPC0gMiAjIGluY3JlYXNlIGZvciBiZXR0ZXIgc3RhYmlsaXR5IG1lYXN1cmVzIHdoZW4gbm90IHRlc3RpbmcgY29kZQoKIyBwIDwtIHByb2dyZXNzcjo6cHJvZ3Jlc3NvcihzdGVwcyA9IG5fcmVwcykKIyBmdXR1cmU6OnBsYW4obXVsdGlzZXNzaW9uLCB3b3JrZXJzID0gbWluKG5fcmVwcywgcGFyYWxsZWw6OmRldGVjdENvcmVzKCkgLSAxKSkKYm9vdHN0cmFwX21vZGVsX3Jlc3VsdHMgPC0gZnV0dXJlLmFwcGx5OjpmdXR1cmVfcmVwbGljYXRlKAogIG4gPSBuX3JlcHMsCiAgZXhwciA9IHsKICAgIGJvb3RzdHJhcCA8LSBzYW1wbGUoMTpucm93KFh0cmFpbiksIG5yb3coWHRyYWluKSwgcmVwbGFjZSA9IFRSVUUpCiAgICBYdHJhaW5fYiA8LSBYdHJhaW5bYm9vdHN0cmFwLCBdCiAgICB5dHJhaW5fYiA8LSB5dHJhaW5bYm9vdHN0cmFwXQogICAgCiAgICAjIGZpdC90cmFpbiBtb2RlbHMgb24gYm9vdHN0cmFwIGRhdGEKICAgIGZpdF9yZXN1bHRzX2IgPC0gZml0TW9kZWxzKFh0cmFpbiA9IFh0cmFpbl9iLCB5dHJhaW4gPSB5dHJhaW5fYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2xpc3QgPSBtb2RlbF9saXN0LCBjdl9vcHRpb25zID0gY3Zfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSA9IHBhcmFtcyRtb2RlbGluZ19wa2cpCgogICAgIyBtYWtlIHByZWRpY3Rpb24gb24gdmFsaWRhdGlvbiBzZXQKICAgIHByZWRfcmVzdWx0c19iIDwtIHByZWRpY3RNb2RlbHMoZml0X2xpc3QgPSBmaXRfcmVzdWx0c19iLCBYdGVzdCA9IFh2YWxpZCkKCiAgICAjIGV2YWx1YXRlIHByZWRpY3Rpb25zIG9uIHZhbGlkYXRpb24gc2V0CiAgICBldmFsX3Jlc3VsdHNfYiA8LSBldmFsdWF0ZU1vZGVscyhwcmVkX2RmID0gcHJlZF9yZXN1bHRzX2IsIHl0ZXN0ID0geXZhbGlkKQogICAgCiAgICAjIGNvbGxlY3QgZmVhdHVyZSBpbXBvcnRhbmNlIG1ldHJpY3MgZnJvbSBtb2RlbCBmaXRzCiAgICBpbXBfcmVzdWx0c19iIDwtIGludGVycHJldE1vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzX2IpCiAgICAKICAgIHJldHVybihsaXN0KCMgZml0ID0gZml0X3Jlc3VsdHNfYiwgICMgdW5jb21tZW50IGlmIG5lZWQgYm9vdHN0cmFwIGZpdHM7IGNhbiBiZSBtZW1vcnkgaW50ZW5zaXZlCiAgICAgICAgICAgICAgICBwcmVkaWN0aW9ucyA9IHByZWRfcmVzdWx0c19iLAogICAgICAgICAgICAgICAgZXZhbF9tZXRyaWNzID0gZXZhbF9yZXN1bHRzX2IsCiAgICAgICAgICAgICAgICBpbXBvcnRhbmNlcyA9IGltcF9yZXN1bHRzX2IpKQogIH0sCiAgc2ltcGxpZnkgPSBGQUxTRQopCgpib290c3RyYXBfbW9kZWxfZXJycyA8LSBwdXJycjo6bWFwX2Rmcihib290c3RyYXBfbW9kZWxfcmVzdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfi54JGV2YWxfbWV0cmljcyRtZXRyaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaWQgPSAiYm9vdHN0cmFwX2lkIikKYm9vdHN0cmFwX21vZGVsX3ByZWRzIDwtIHB1cnJyOjptYXAoYm9vdHN0cmFwX21vZGVsX3Jlc3VsdHMsICJwcmVkaWN0aW9ucyIpCmJvb3RzdHJhcF9tb2RlbF9pbXBzIDwtIHB1cnJyOjptYXBfZGZyKGJvb3RzdHJhcF9tb2RlbF9yZXN1bHRzLCAiaW1wb3J0YW5jZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaWQgPSAiYm9vdHN0cmFwX2lkIikKCiMgc3VtbWFyaXplIGJvb3RzdHJhcCBtb2RlbCBlcnJvciBtZXRyaWNzCmJvb3RzdHJhcF9tb2RlbF9lcnJzX3N1bW1hcnkgPC0gYm9vdHN0cmFwX21vZGVsX2VycnMgJT4lCiAgdGlkeXI6OnBpdm90X2xvbmdlcihjb2xzID0gYygtYm9vdHN0cmFwX2lkLCAtTWV0cmljKSwgCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJNZXRob2QiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTWV0aG9kLCBNZXRyaWMpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoTWVhbiA9IG1lYW4oVmFsdWUpLCBTRCA9IHNkKFZhbHVlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgdGlkeXI6OnBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuLCBTRCksIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlZhbHVlIiwgbmFtZXNfdG8gPSAiU3RhdGlzdGljIikgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAiTWV0aG9kIiwgdmFsdWVzX2Zyb20gPSAiVmFsdWUiKSAlPiUKICBkcGx5cjo6YXJyYW5nZShNZXRyaWMsIFN0YXRpc3RpYykKYGBgCgojIyMgVGFibGUgey51bm51bWJlcmVkfQoKYGBge3Igc3RhYmlsaXR5LWNoZWNrLXRhYmxlLCByZXN1bHRzID0gImFzaXMifQojIHRhYmxlIG9mIGFjY3VyYWN5IG1ldHJpY3MKcHJldHR5VGFibGUoCiAgYm9vdHN0cmFwX21vZGVsX2VycnNfc3VtbWFyeSwgCiAgZGlnaXRzID0gMiwgc2lnZmlnID0gRkFMU0UsIHJvd25hbWVzID0gRkFMU0UsCiAgaHRtbCA9IFRSVUUsCiAgY2FwdGlvbiA9ICJWYWxpZGF0aW9uIFByZWRpY3Rpb24gQWNjdXJhY2llcyBPdmVyIEJvb3RzdHJhcHBlZCBUcmFpbmluZyBGaXRzIiwgCiAgaHRtbF9vcHRpb25zID0gbGlzdCgKICAgIGV4dGVuc2lvbnMgPSAiUm93R3JvdXAiLAogICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gInQiLAogICAgICAgICAgICAgICAgICAgcm93R3JvdXAgPSBsaXN0KGRhdGFTcmMgPSAwKSwKICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gImR0LWNlbnRlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzID0gIl9hbGwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QodmlzaWJsZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzID0gMCkpKQogICkKKQoKIyBzaW1DaGVmOjpwcmV0dHlfa2FibGUoCiMgICBib290c3RyYXBfbW9kZWxfZXJyc19zdW1tYXJ5ICU+JSAKIyAgICAgZHBseXI6OnNlbGVjdCgtTWV0cmljKSAlPiUgCiMgICAgIGRwbHlyOjpyZW5hbWUoTWV0cmljID0gU3RhdGlzdGljKSwgCiMgICBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGQUxTRSwgZnVsbF93aWR0aCA9IEZBTFNFLAojICAgZm9ybWF0ID0gaWZlbHNlKGtuaXRyOjppc19odG1sX291dHB1dCgpLCAiaHRtbCIsICJsYXRleCIpLAojICAgY2FwdGlvbiA9ICJWYWxpZGF0aW9uIFByZWRpY3Rpb24gQWNjdXJhY2llcyBPdmVyIEJvb3RzdHJhcHBlZCBUcmFpbmluZyBGaXRzIgojICkgJT4lCiMgICBrYWJsZUV4dHJhOjpncm91cF9yb3dzKAojICAgICBpbmRleCA9IHJlcCgyLCBsZW5ndGgodW5pcXVlKGJvb3RzdHJhcF9tb2RlbF9lcnJzX3N1bW1hcnkkTWV0cmljKSkpICU+JQojICAgICAgIHNldE5hbWVzKHVuaXF1ZShib290c3RyYXBfbW9kZWxfZXJyc19zdW1tYXJ5JE1ldHJpYykpLCAKIyAgICAgbGFiZWxfcm93X2NzcyA9ICJiYWNrZ3JvdW5kOiAjREREREREIiwgCiMgICApICU+JQojICAga2FibGVFeHRyYTo6c2Nyb2xsX2JveChoZWlnaHQgPSAiNTAwcHgiKQpgYGAKCiMjIyBQbG90IHsudW5udW1iZXJlZH0KCmBgYHtyIHN0YWJpbGl0eS1jaGVjay1ib3hwbG90fQojIGJveHBsb3RzCmJvb3RzdHJhcF9tb2RlbF9lcnJzICU+JQogIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9IGMoLWJvb3RzdHJhcF9pZCwgLU1ldHJpYyksIAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiTWV0aG9kIiwgdmFsdWVzX3RvID0gIlZhbHVlIikgJT4lCiAgcGxvdEJveHBsb3QoeF9zdHIgPSAiTWV0aG9kIiwgeV9zdHIgPSAiVmFsdWUiKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+IE1ldHJpYykgKwogIGdncGxvdDI6OmxhYnModGl0bGUgPSAiVmFsaWRhdGlvbiBQcmVkaWN0aW9uIEFjY3VyYWNpZXMgT3ZlciBCb290c3RyYXBwZWQgVHJhaW5pbmcgRml0cyIpCmBgYAoKIyMgSW50ZXJwcmV0YWJpbGl0eSB7LnRhYnNldCAuY3VzdG9tLXRhYnN9CgpGb3IgdGhlIG1vZGVscyB0aGF0IHBhc3MgdGhlIHByZWRpY3Rpb24gYW5kIHN0YWJpbGl0eSBjaGVja3MsIGV4dHJhY3QgdGhlIGltcG9ydGFudCBmZWF0dXJlcyBpbiB0aGUgcHJlZGljdGl2ZSBtb2RlbHMgdGhhdCBhcmUgc3RhYmxlIGFjcm9zcyBib3RoIGRhdGEgYW5kIG1vZGVsIHBlcnR1cmJhdGlvbnMuIERldGVybWluaW5nIHRoZSBpbXBvcnRhbmNlIG9mIGEgZmVhdHVyZSBjYW4gYmUgbWV0aG9kIGRlcGVuZGVudC4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyMjIEZ1bGwgTW9kZWwgKHdpdGhvdXQgc3RhYmlsaXR5KSB7LnVubnVtYmVyZWQgLnRhYnNldCAudGFic2V0LXBpbGxzfQoKIyMjIyBUYWJsZSB7LnVubnVtYmVyZWR9CgpgYGB7ciBpbnRlcnByZXRhYmlsaXR5LXRhYmxlLCBhZGRfbmV3X2xpbmUgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQpwcmV0dHlUYWJsZShpbXBfcmVzdWx0cywgZGlnaXRzID0gMiwgc2lnZmlnID0gRkFMU0UsCiAgICAgICAgICAgIGNhcHRpb24gPSAiVmFyaWFibGUgSW1wb3J0YW5jZXMiKQpgYGAKCiMjIyMgUGxvdHMgey51bm51bWJlcmVkfQoKYGBge3IgaW50ZXJwcmV0YWJpbGl0eS1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90RmVhdHVyZUltcG9ydGFuY2UoaW1wX3Jlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgICB1c2VfcmFua2luZ3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIHVzZV9mYWNldHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSBGQUxTRSkKYGBgCgpgYGB7ciBpbnRlcnByZXRhYmlsaXR5LXBhaXItcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KcGxvdEZlYXR1cmVJbXBvcnRhbmNlUGFpcihpbXBfcmVzdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcmFua2luZ3MgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gRkFMU0UpCmBgYAoKIyMjIEJvb3RzdHJhcHBlZCBNb2RlbCAod2l0aCBzdGFiaWxpdHkpIHsudW5udW1iZXJlZCAudGFic2V0IC50YWJzZXQtcGlsbHN9CgojIyMjIFRhYmxlIHsudW5udW1iZXJlZH0KCmBgYHtyIGJvb3QtaW50ZXJwcmV0YWJpbGl0eS10YWJsZSwgYWRkX25ld19saW5lID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KYm9vdHN0cmFwX21vZGVsX2ltcHNfc3VtbWFyeSA8LSBib290c3RyYXBfbW9kZWxfaW1wcyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTWV0aG9kLCBWYXJpYWJsZSkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShgTWVhbiBJbXBvcnRhbmNlYCA9IG1lYW4oSW1wb3J0YW5jZSksCiAgICAgICAgICAgICAgICAgICBgTWVkaWFuIEltcG9ydGFuY2VgID0gbWVkaWFuKEltcG9ydGFuY2UpLAogICAgICAgICAgICAgICAgICAgYFNEIEltcG9ydGFuY2VgID0gc2QoSW1wb3J0YW5jZSksCiAgICAgICAgICAgICAgICAgICBgTWluIEltcG9ydGFuY2VgID0gbWluKEltcG9ydGFuY2UpLAogICAgICAgICAgICAgICAgICAgYE1heCBJbXBvcnRhbmNlYCA9IG1heChJbXBvcnRhbmNlKSwgCiAgICAgICAgICAgICAgICAgICAuZ3JvdXBzID0gImtlZXAiKQpwcmV0dHlUYWJsZSgKICBib290c3RyYXBfbW9kZWxfaW1wc19zdW1tYXJ5LCAKICBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGLCAKICBjYXB0aW9uID0gIlN1bW1hcnkgb2YgdmFyaWFibGUgaW1wb3J0YW5jZXMgYWNyb3NzIGJvb3RzdHJhcHBlZCBtb2RlbHMiCikKYGBgCgojIyMjIFBsb3RzIHsudW5udW1iZXJlZH0KCmBgYHtyIGJvb3QtaW50ZXJwcmV0YWJpbGl0eS1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQpwbG90RmVhdHVyZUltcG9ydGFuY2VTdGFiaWxpdHkoYm9vdHN0cmFwX21vZGVsX2ltcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcmFua2luZ3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mYWNldHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSBGQUxTRSkKYGBgCgojIE1haW4gUmVzdWx0cwoKIyMgey51bm51bWJlcmVkIC50YWJzZXQgLmN1c3RvbS10YWJzfQoKSW50ZXJwcmV0IGFuZCBzdW1tYXJpemUgdGhlIHByZWRpY3Rpb24gYW5kIHN0YWJpbGl0eSByZXN1bHRzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpFdmFsdWF0ZSBwaXBlbGluZSBvbiB0ZXN0IGRhdGEuCgpgYGB7ciBmaW5hbC1maXRzLCBjbGFzcy5vdXRwdXQ9InNjcm9sbC0zMDAifQpYdHJhaW5fZmluYWwgPC0gZHBseXI6OmJpbmRfcm93cyhYdHJhaW4sIFh2YWxpZCkKeXRyYWluX2ZpbmFsIDwtIGMoeXRyYWluLCB5dmFsaWQpCgojIGZpdC90cmFpbiBtb2RlbHMKZml0X3Jlc3VsdHNfZmluYWwgPC0gZml0TW9kZWxzKFh0cmFpbiA9IFh0cmFpbl9maW5hbCwgeXRyYWluID0geXRyYWluX2ZpbmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbGlzdCA9IG1vZGVsX2xpc3QsIGN2X29wdGlvbnMgPSBjdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gcGFyYW1zJG1vZGVsaW5nX3BrZykKCiMgbWFrZSBwcmVkaWN0aW9uIG9uIHRlc3Qgc2V0CnByZWRfcmVzdWx0c19maW5hbCA8LSBwcmVkaWN0TW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHNfZmluYWwsIFh0ZXN0ID0gWHRlc3QpCgojIGV2YWx1YXRlIHByZWRpY3Rpb25zIG9uIHRlc3Qgc2V0CmV2YWxfcmVzdWx0c19maW5hbCA8LSBldmFsdWF0ZU1vZGVscyhwcmVkX2RmID0gcHJlZF9yZXN1bHRzX2ZpbmFsLCB5dGVzdCA9IHl0ZXN0KQoKIyBjb2xsZWN0IGZlYXR1cmUgaW1wb3J0YW5jZSBtZXRyaWNzIGZyb20gbW9kZWwgZml0cwppbXBfcmVzdWx0c19maW5hbCA8LSBpbnRlcnByZXRNb2RlbHMoZml0X2xpc3QgPSBmaXRfcmVzdWx0c19maW5hbCkKYGBgCgpTdW1tYXJpemUgdGVzdCBzZXQgcHJlZGljdGlvbiBhbmQvb3IgaW50ZXJwcmV0YWJpbGl0eSByZXN1bHRzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgo8IS0tIFRPRE86IEFuYSAtIGFkZCB0ZW1wbGF0ZSB0YWJsZXMgd2l0aCBpbnRlcnByZXRhdGlvbiAtLT4KCiMjIyBGaXQgU3VtbWFyeSB7LnVubnVtYmVyZWQgLnRhYnNldCAudGFic2V0LXBpbGxzfQoKYGBge3IgZmluYWwtZml0LXN1bW1hcnksIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIn0KIyBwcmludCBvdXQgZml0IG91dHB1dCBzdW1tYXJ5CnByaW50Rml0UmVzdWx0cyhmaXRfcmVzdWx0c19maW5hbCkKYGBgCgojIyMgUHJlZGljdGlvbiBSZXN1bHRzIHsudW5udW1iZXJlZH0KCmBgYHtyIGZpbmFsLXByZWRpY3Rpb24tcmVzdWx0cywgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImFzaXMifQojIGRpc3BsYXkgcHJlZGljdGlvbiBtZXRyaWNzLCBjb25mdXNpb24gbWF0cmljZXMsIGFuZCByb2MvcHIgcGxvdHMgaWYgYXBwbGljYWJsZQpzaG93RXZhbFJlc3VsdHMoZXZhbF9yZXN1bHRzX2ZpbmFsLCB0ZXN0X3NldCA9IFRSVUUsIGRpZ2l0cyA9IDIsIHNpZ2ZpZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgaHRtbF9vcHRpb25zID0gbGlzdChvcHRpb25zID0gbGlzdChkb20gPSAidCIpKSkKYGBgCgojIFBvc3QgaG9jIGFuYWx5c2lzCgpNb3ZlIGJleW9uZCB0aGUgZ2xvYmFsIHByZWRpY3Rpb24gYWNjdXJhY3kgbWV0cmljcyBhbmQgZGl2ZSBkZWVwZXIgaW50byBpbmRpdmlkdWFsLWxldmVsIHByZWRpY3Rpb25zIGZvciB0aGUgdmFsaWRhdGlvbiBhbmQvb3IgdGVzdCBzZXQsIGkuZS4sIHByb3ZpZGUgYSBtb3JlICJsb2NhbCIgYW5hbHlzaXMuCgotICAgRXhhbWluZSBhbnkgcG9pbnRzIHRoYXQgaGFkIHBvb3IgcHJlZGljdGlvbnMuCi0gICBFeGFtaW5lIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGlvbiBtZXRob2RzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpgYGB7ciBwb3N0aG9jLXBhaXItcGxvdH0KcHJlZF9yZXN1bHRzX2ZpbmFsICU+JQogIGRwbHlyOjptdXRhdGUoLmlkID0gcmVwKDE6bnJvdyhYdGVzdCksIGxlbmd0aC5vdXQgPSBkcGx5cjo6bigpKSkgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKGlkX2NvbHMgPSAuaWQsIAogICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gIk1ldGhvZCIsIHZhbHVlc19mcm9tID0gInByZWRpY3Rpb25zIikgJT4lCiAgZHBseXI6Om11dGF0ZShgVHJ1ZSBSZXNwb25zZXNgID0geXRlc3QpICU+JQogIHBsb3RQYWlycyhjb2x1bW5zID0gMjoobGVuZ3RoKHVuaXF1ZShwcmVkX3Jlc3VsdHNfZmluYWwkTWV0aG9kKSkgKyAyKSwKICAgICAgICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBtb2RlbCB0ZXN0IHByZWRpY3Rpb25zIikKYGBgCgojIENvbmNsdXNpb25zCgpSZWl0ZXJhdGUgbWFpbiBmaW5kaW5ncywgbm90ZSBhbnkgY2F2ZWF0cywgYW5kIGNsZWFybHkgdHJhbnNsYXRlIGZpbmRpbmdzL2FuYWx5c2lzIGJhY2sgdG8gdGhlIGRvbWFpbiBwcm9ibGVtIGNvbnRleHQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCg==